{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 数据准备\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [],
   "source": [
    "import sys\n",
    "sys.path.append('..')\n",
    "import numpy as np\n",
    "import importlib\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The autoreload extension is already loaded. To reload it, use:\n",
      "  %reload_ext autoreload\n"
     ]
    }
   ],
   "source": [
    "%load_ext autoreload\n",
    "%autoreload 2\n",
    "# importlib.reload(utils.matplot)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [],
   "source": [
    "from utils.mnist import loadMNIST, toHotEncoding\n",
    "from utils.matplot import plot_binary, plot_precision_recall_vs_threshold, plot_precision_recall"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "x_train, y_train = loadMNIST(\"train\", \"/Users/tzp/data/mnist\" )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = [2, 3]\n",
    "b = (a==2)\n",
    "b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ True, False])"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "na = np.array(a)\n",
    "nb = (na == 2) # todo 什么诡异的np语法糖?\n",
    "nb"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ True, False, False, ...,  True, False, False])"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_5 = (y_train == 5)\n",
    "y_train_5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(60000, 28, 28)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "(60000, 784)"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(x_train.shape)\n",
    "X_train=x_train.reshape(60000, 784)\n",
    "X_train.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "SGDClassifier(random_state=42)"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import SGDClassifier\n",
    "sgd_clf = SGDClassifier(random_state=42) \n",
    "sgd_clf.fit(X_train, y_train_5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "some_digit = X_train[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<module 'matplotlib.pyplot' from '/Users/tzp/opt/miniconda3/envs/mlflow-dev-env/lib/python3.7/site-packages/matplotlib/pyplot.py'>"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_binary(X_train[0].reshape(28,28))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ True])"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sgd_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 评估"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[52316,  2263],\n",
       "       [  601,  4820]])"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "y_train_pred=sgd_clf.predict(X_train)\n",
    "confusion_matrix(y_train_5, y_train_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import cross_val_predict\n",
    "y_train_pred = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3)\n",
    "# todo 这个cross_val应该是重新训练模型的, 3fold, 里面应该有三个模型对象啊, 这里得不到这3个模型?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[52316,  2263],\n",
       "       [  601,  4820]])"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "cm=confusion_matrix(y_train_5, y_train_pred) \n",
    "# 行表示实际类别，列表示预测类别\n",
    "cm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "precision 0.6805026118876183\n",
      "recall 0.8891348459693783\n",
      "True\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0.7709532949456175"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 准确率\n",
    "precision = cm[1][1] / (cm[1][1] + cm[0][1])\n",
    "print(f\"precision {precision}\")\n",
    "\n",
    "# 召回率\n",
    "recall = cm[1][1] / (cm[1][0] + cm[1][1])\n",
    "print(f\"recall {recall}\")\n",
    "\n",
    "from sklearn.metrics import precision_score, recall_score, f1_score\n",
    "print(precision == precision_score(y_train_5, y_train_pred) \n",
    "  and recall == recall_score(y_train_5, y_train_pred))\n",
    "\n",
    "f1_score(y_train_5, y_train_pred)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## pr曲线"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([2164.22030239])"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_scores = sgd_clf.decision_function([some_digit])\n",
    "y_scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_scores = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3, n_jobs=-1,\n",
    "  method=\"decision_function\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import precision_recall_curve\n",
    "precisions, recalls, thresholds = precision_recall_curve(y_train_5, y_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(59966,)"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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R+mRRx6Rqqura+13lvtsjJt9BuWk1WqlqVOnSm3atJFOnTpVa7+l/v5Z4ne1KYqKiox+F48ePSrFxMRI//d//ycdPXrUae7TWpp1MnLx4kXp0KFD0pw5c6SWLVtKhw4dkg4dOqT/ktZ1sxo+fLiUkpIibdy4UQoMDKyzm9Xrr78upaamSosWLaqzm5VarZa+++476cSJE9JTTz0l+fr6GrWYfuaZZ6S2bdtK27Ztkw4cOCDFxcVJcXFx+v2mxGKq3NxcqVWrVtL9998vpaSkSGlpadJrr70mubq6SikpKXZ374310ksvSaGhodKmTZukkydPSpMnT5aCgoKk/Px8p7nHG50/f75Wb5qCggIpODhYevzxx6Vjx45JK1eulDw9PWt1eXVxcZE+/vhjKTU1VZo9e3adXV59fX2lX375RTpy5Ih077331tnltXfv3tLevXul3bt3Sx07drRIl9dLly5JHTp0kO644w7p0qVL0pUrV/QvZ7rPxjLlMyiXZ599VvLx8ZF27Nhh9O9WWlqqL2OJv3+W+l21pJq9aZz5Pi2hWScjEyZMkADUem3fvl1f5sKFC9KIESMkDw8PKSAgQHr11Velqqoqo/Ns375dio6Oltzc3KTIyEhp2bJlta71+eefS23btpXc3Nyk/v37S3/99ZfR/rKyMum5556T/Pz8JE9PT+m+++4z+kNraiym2r9/vzR8+HDJ399f8vLykgYMGCAlJiaafT1b3XtjVFZWSq+++qoUFBQkeXl5SfHx8dKxY8ec6h5vVFcyIkmSdPjwYWnw4MGSWq2WQkNDpfnz59c69qeffpI6deokubm5Sd27d5fWr19vtF+r1UozZ86UgoODJbVaLd1xxx1SWlqaUZmrV69K48aNk1q2bCl5e3tLkyZNqlUD1xjLli2r83f1xspdR7/PprjZZ1Au9f271fw9stTfP0v8rlrSjcmIs96nJSgkSZJs9ESIiIiIqBan601DREREjoXJCBEREcmKyQgRERHJiskIERERyYrJCBEREcmKyQgRERHJiskIERERyYrJCBEREcmKyQgRERHJiskIERERyYrJCBEREcmKyQgRERHJ6v8D+7/4MH0qr4kAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "pr_t = plot_precision_recall_vs_threshold(precisions, recalls, thresholds)\n",
    "# 当你提高阈值时，精度有时也有可能会下降 （尽管总体趋势是上升的"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {},
   "outputs": [
    {
     "ename": "FileNotFoundError",
     "evalue": "[Errno 2] No such file or directory: 'output/my_figure1.png'",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mFileNotFoundError\u001b[0m                         Traceback (most recent call last)",
      "\u001b[0;32m/var/folders/lz/_5s3jxcd2g10p1nk3ppjb2kr0000gn/T/ipykernel_76440/3701679116.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[0mfig\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfigure\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mfig\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msavefig\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'output/my_figure1.png'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;32m~/opt/miniconda3/envs/mlflow-dev-env/lib/python3.7/site-packages/matplotlib/figure.py\u001b[0m in \u001b[0;36msavefig\u001b[0;34m(self, fname, transparent, **kwargs)\u001b[0m\n\u001b[1;32m   3056\u001b[0m                         ax.patch._cm_set(facecolor='none', edgecolor='none'))\n\u001b[1;32m   3057\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3058\u001b[0;31m             \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcanvas\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprint_figure\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   3059\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   3060\u001b[0m     def ginput(self, n=1, timeout=30, show_clicks=True,\n",
      "\u001b[0;32m~/opt/miniconda3/envs/mlflow-dev-env/lib/python3.7/site-packages/matplotlib/backend_bases.py\u001b[0m in \u001b[0;36mprint_figure\u001b[0;34m(self, filename, dpi, facecolor, edgecolor, orientation, format, bbox_inches, pad_inches, bbox_extra_artists, backend, **kwargs)\u001b[0m\n\u001b[1;32m   2323\u001b[0m                         \u001b[0morientation\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0morientation\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2324\u001b[0m                         \u001b[0mbbox_inches_restore\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0m_bbox_inches_restore\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2325\u001b[0;31m                         **kwargs)\n\u001b[0m\u001b[1;32m   2326\u001b[0m             \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2327\u001b[0m                 \u001b[0;32mif\u001b[0m \u001b[0mbbox_inches\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mrestore_bbox\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/opt/miniconda3/envs/mlflow-dev-env/lib/python3.7/site-packages/matplotlib/backend_bases.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m   1646\u001b[0m             \u001b[0mkwargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1647\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1648\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1649\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1650\u001b[0m     \u001b[0;32mreturn\u001b[0m \u001b[0mwrapper\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/opt/miniconda3/envs/mlflow-dev-env/lib/python3.7/site-packages/matplotlib/_api/deprecation.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*inner_args, **inner_kwargs)\u001b[0m\n\u001b[1;32m    413\u001b[0m                          \u001b[0;32melse\u001b[0m \u001b[0mdeprecation_addendum\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    414\u001b[0m                 **kwargs)\n\u001b[0;32m--> 415\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minner_args\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0minner_kwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    416\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    417\u001b[0m     \u001b[0mDECORATORS\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mwrapper\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdecorator\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/opt/miniconda3/envs/mlflow-dev-env/lib/python3.7/site-packages/matplotlib/backends/backend_agg.py\u001b[0m in \u001b[0;36mprint_png\u001b[0;34m(self, filename_or_obj, metadata, pil_kwargs, *args)\u001b[0m\n\u001b[1;32m    541\u001b[0m         mpl.image.imsave(\n\u001b[1;32m    542\u001b[0m             \u001b[0mfilename_or_obj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbuffer_rgba\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mformat\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"png\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0morigin\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"upper\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 543\u001b[0;31m             dpi=self.figure.dpi, metadata=metadata, pil_kwargs=pil_kwargs)\n\u001b[0m\u001b[1;32m    544\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    545\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mprint_to_buffer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/opt/miniconda3/envs/mlflow-dev-env/lib/python3.7/site-packages/matplotlib/image.py\u001b[0m in \u001b[0;36mimsave\u001b[0;34m(fname, arr, vmin, vmax, cmap, format, origin, dpi, metadata, pil_kwargs)\u001b[0m\n\u001b[1;32m   1673\u001b[0m         \u001b[0mpil_kwargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msetdefault\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"format\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mformat\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1674\u001b[0m         \u001b[0mpil_kwargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msetdefault\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"dpi\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mdpi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdpi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1675\u001b[0;31m         \u001b[0mimage\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msave\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mpil_kwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1676\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1677\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/opt/miniconda3/envs/mlflow-dev-env/lib/python3.7/site-packages/PIL/Image.py\u001b[0m in \u001b[0;36msave\u001b[0;34m(self, fp, format, **params)\u001b[0m\n\u001b[1;32m   2315\u001b[0m                 \u001b[0mfp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbuiltins\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilename\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"r+b\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2316\u001b[0m             \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2317\u001b[0;31m                 \u001b[0mfp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbuiltins\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilename\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"w+b\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   2318\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2319\u001b[0m         \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: 'output/my_figure1.png'"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure()\n",
    "fig.savefig('output/my_figure1.png')\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "mlflow-dev-env",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.13"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
